package br.com.ac.fatureweb.service;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.Local;
import javax.ejb.Stateless;
import javax.inject.Named;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import br.com.ac.fatureweb.model.Roteiro;
import br.com.ac.fatureweb.model.vo.MonitoramentoVO;
import br.com.ac.fatureweb.utilitary.NgcDefaultBean;

@Local
@Named
@Stateless
public class NgcMonitoramentoBean extends NgcDefaultBean<Roteiro> {

	@PersistenceContext
	private EntityManager entityManager;

	@PostConstruct
	void inicialize() {
		setEm(entityManager);
	}

	/**
	 * 
	 * @param parametersSearch
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<MonitoramentoVO> consultarMonitoramento(
			MonitoramentoVO parametersSearch) {
		StringBuilder sb = new StringBuilder();
		
		sb.append(" SELECT NEW br.com.ac.fatureweb.model.vo.MonitoramentoVO("
				+ " rot.longitude, rot.latitude,"
				
				+ " (SELECT COUNT(*) FROM LogLeitura log"
				+ "  WHERE log.roteiro.id = rot.id"
				+ " ) AS qtdImovelRetornado,"
				
				+ " carga.id, rot.numero, rot.competencia, rot.dataGeracao, rot.dataCarga,"
				+ " rot.dataRetorno, rot.dataFaturamento, rot.qtdImovel, rot.status,"
				+ " equi.imei, equi.chip, equi.numero, equi.status,"
				+ " lei.codigo, lei.nome, lei.cpf, lei.status"
				+ " )");
		
		sb.append(" FROM Roteiro rot"
				+ " INNER JOIN rot.carga carga"
				+ " INNER JOIN rot.equipamento equi"
				+ " INNER JOIN equi.leiturista lei");
		
		sb.append(" WHERE carga.id = :idCarga"
				+ " AND rot.competencia = :competencia");
		
		if ( parametersSearch.getCodLeiturista() != null )
		{
			sb.append(" AND lei.codigo = :codigo ");
		}
		if ( parametersSearch.getNumRoteiro() != null )
		{
			sb.append(" AND rot.numero = :numero ");
		}
		if ( parametersSearch.getSituacaoRoteiro() != null )
		{
			sb.append(" AND rot.status = :status ");
		}
		
		Query query = entityManager.createQuery(sb.toString());
		query.setParameter("idCarga", parametersSearch.getIdCarga());
		query.setParameter("competencia", parametersSearch.getCompetencia());
		
		if ( parametersSearch.getCodLeiturista() != null )
		{
			query.setParameter("codigo", parametersSearch.getCodLeiturista());
		}
		if ( parametersSearch.getNumRoteiro() != null )
		{
			query.setParameter("numero", parametersSearch.getNumRoteiro());
		}
		if ( parametersSearch.getSituacaoRoteiro() != null )
		{
			query.setParameter("status", parametersSearch.getSituacaoRoteiro());
		}
		
		List<MonitoramentoVO> lstMonitoramento = query.getResultList();
		
		if ( lstMonitoramento != null && !lstMonitoramento.isEmpty() )
		{
			final List<MonitoramentoVO> lstSemLocalizacao = new ArrayList<MonitoramentoVO>();

			for (final MonitoramentoVO vo : lstMonitoramento)
			{
				if ( vo.getLatitude() == null || vo.getLongitude() == null )
				{
					lstSemLocalizacao.add(vo);
				}
			}
			
			lstMonitoramento.removeAll(lstSemLocalizacao);

			return lstMonitoramento;
		}
		
		return null;
	}
}
